// 路由的鉴权， 项目当中的路由被访问的权限的设置（某个路由什么时候能被访问，什么时候不能访问）
import router from './router/index'
import NProgress from 'nprogress' // progress bar
// 引入进度条的样式
import 'nprogress/nprogress.css' // progress bar style
NProgress.configure({ showSpinner: false })

// 引入setting 设置
import setting from './setting'

// 先获取大仓库pinia
import pinia from './store/index'
// 获取用户相关的小仓库内部的token 数据， 去判断用户是否登录成功
import useUserStore from './store/modules/user'
const userStore = useUserStore(pinia)

// console.log('lll', userStore.username);

// 全局的前置守卫
router.beforeEach(async (to: any, from: any, next: any) => {
  document.title = `${setting.title} - ${to.meta.title}`
  // to and from are both route objects. must call `next`.
  NProgress.start()
  // 获取token 去判断用户是否登录
  const token = userStore.token
  if (token) {
    // 登录成功
    if (to.path == '/login') {
      // 登录成功，不能再去login, 指向首页
      next({ path: '/' })
    } else {
      // 登录成功，访问其他的路由（除登录之外）
      // 有用户信息，才可以跳转其他页面
      // 获取用户的名字
      const username = userStore.username
      if (username) {
        next()
      } else {
        // 没有用户信息，发请求获取用户信息,再放行
        try {
          // 获取用户信息
          await userStore.userInfo()
          // 放行
          // next()
          // 万一：刷新的时候是异步路由，有可能获取到用户信息，但是异步路由还没有加载完毕，出现空白的效果
          next({ ...to })
        } catch (error) {
          /* has no token*/
          // 登录成功 - 没有用户信息 - 发请求也没拿到  ===> token 过期了， 清空用户信息，重新登录
          // 暂时退出登录 -> 用户相关的数据清空
          await userStore.userLogout()
          next({ path: '/login', query: { redirect: to.path } })
          //   console.error(error)
        }
      }
    }
    // next()
  } else {
    // 未登录
    if (to.path == '/login') {
      // 未登录 去登录页，可以
      next()
    } else {
      // 未登录去其他页面，不可以
      next({ path: '/login', query: { redirect: to.path } })
    }
  }
})

// 全局的后置守卫
router.afterEach((to: any, from: any) => {
  // to and from are both route objects.
  NProgress.done()
})

// 1.任意路由的切换实现进度条的业务  -- nprogress插件
// 2.路由组件访问权限的设置
// 路由： 登录 | 404 | 任意路由 | home首页 | 数据大屏 | 权限管理（3个子路由） | 商品管理（4个子路由） |

// 未登录： 只能访问login页面，其余都行
// 登录成功： 不能访问login页面，其余都行
